package ar.com.laley.centro.servicios;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.Transaction;
import org.hibernate.classic.Session;

import ar.com.laley.centro.beans.AreaInteres;
import ar.com.laley.centro.beans.Catedra;
import ar.com.laley.centro.beans.Consulta;
import ar.com.laley.centro.beans.Direccion;
import ar.com.laley.centro.beans.HibernateUtil;
import ar.com.laley.centro.beans.Materia;
import ar.com.laley.centro.beans.Producto;
import ar.com.laley.centro.beans.UConsultante;
import ar.com.laley.centro.dao.AreaInteresDAOImpl;
import ar.com.laley.centro.dao.CatedraDAOImpl;
import ar.com.laley.centro.dao.ConsultaDAOImpl;
import ar.com.laley.centro.dao.MateriaDAOImpl;
import ar.com.laley.centro.dao.ProductoDAOImpl;
import ar.com.laley.centro.forms.DatosConsultaForm;

public abstract class ServicioConsulta {

	public static boolean ingresarConsulta(DatosConsultaForm form) {
		Transaction tx = null;
		Session session = null;
		try {
			session = (Session) HibernateUtil.currentSession();
			tx = session.beginTransaction();

			Consulta consulta = new Consulta();
			boolean resultado = false;

			consulta = ServicioConsulta.mappearDatosConsulta(form);

			ConsultaDAOImpl consultaDAO = new ConsultaDAOImpl();
			if (consultaDAO.registrar(consulta)) {
				resultado = true;
			} else {
				throw new RuntimeException("No se pudo grabar la consulta");
			}
			tx.commit();
			return resultado;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			throw new RuntimeException(
					"Ocurrio una exception al guardar una consulta", e);
		} finally {
			if (session != null) {
				session.close();
			}
		}

	}

	private static Consulta mappearDatosConsulta(DatosConsultaForm form) {
		Consulta consulta = new Consulta();

		// Cargo Usuario de Consulta
		UConsultante usuario = new UConsultante();

		// Datos Particular
		usuario.setConsultanteNombre(form.getFormNombre());
		usuario.setConsultanteApellido(form.getFormApellido());

		usuario.setConsultanteGenero(form.getFormGenero());

		int telefono = !"".equals(form.getFormTelefonoParticular()) ? new Integer(
				form.getFormTelefonoParticular()).intValue()
				: 0;
		int celular = !"".equals(form.getFormCelular()) ? new Integer(form
				.getFormCelular()).intValue() : 0;

		usuario.setConsultanteCelular(celular);
		usuario.setUsuarioTelefono(telefono);

		usuario.setConsultanteTipoDoc(form.getFormTipoDocumento());
		usuario
				.setConsultanteDocumento((new Integer(form
						.getFormNumDocumento())).intValue());
		usuario.setUsuarioEmail(form.getFormEmail());

		Direccion direccion = new Direccion();
		direccion.setDireccionCalle(form.getFormDomicilioParticular());
		direccion.setDireccionCP(form.getFormCodigoPostalParticular());
		direccion.setDireccionLocalidad(form.getFormLocalidadParticular());
		direccion.setDireccionNumero(form.getFormNumeroDomicilioParticular());
		direccion.setDireccionPisoDpto(form.getFormPisoDptoParticular());
		usuario.setDatosDireccion(direccion);

		// Datos Laboral
		usuario.setEmpresaNombre(form.getFormNombreEmpresa());
		usuario.setEmpresaRubro(form.getFormRubroTrabajo());

		// Datos Profesion
		usuario.setConsultanteProfesion(form.getFormSelectionTypeProfesion());

		// Datos para analisis
		usuario.setConsultanteDeseaRecibirMaterial(form
				.getFormSiReciboNovedades().equals("true") ? "y" : "n");
		usuario
				.setConsultanteSiTrabaja(form.getFormTrabaja().equals("true") ? "y"
						: "n");

		consulta.setConsultaConsultante(usuario);

		// Cargo Materia de Consulta
		if ("cpo".equals(form.getFormTipoMateria())) {
			// significa que ingreso un valor de materia
			consulta.setMateriaCPO(form.getFormSeleccionMateriaCPO());

		} else if ("cpc".equals(form.getFormTipoMateria())) {
			// significa que eligio de la lista con id de materia
			MateriaDAOImpl materiadao = new MateriaDAOImpl();
			CatedraDAOImpl catedradao = new CatedraDAOImpl();
			Materia materia = new Materia();
			Catedra catedra = new Catedra();
			try {
				materia = materiadao.listar((new Integer(form
						.getFormSeleccionMateria())).intValue());
				catedra = catedradao.listar((new Integer(form
						.getFormOpcionCatedra())).intValue());

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				throw new RuntimeException("No se pudo listar la materia", e);
			}
			consulta.setConsultaMateria(materia);
			consulta.setConsultaCatedra(catedra);
		}

		// Cargo Producto de Consulta
		ProductoDAOImpl productodao = new ProductoDAOImpl();
		Producto producto = null;
		try {
			producto = productodao.listar(new Integer(form
					.getFormSeleccionProducto()).intValue());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		consulta.setConsultaProducto(producto);

		// Cargo Area de Interes de Consulta
		AreaInteresDAOImpl areainteres = new AreaInteresDAOImpl();
		AreaInteres area = null;
		try {
			area = areainteres.listar(new Integer(form
					.getFormSelectionTypeInteres()).intValue());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(
					"No se pudo listar las areas de interes", e);
		}
		consulta.setConsultaAreaInteres(area);

		// Cargo la fecha de la consulta
		Date todaysDate = new java.util.Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		int formattedDate = new Integer(formatter.format(todaysDate))
				.intValue();
		consulta.setConsultaFecha(formattedDate);

		return consulta;
	}

	/**
	 * Busca en la BD todas las consultas realizada en un rango de fecha dado
	 * por el usuario y las carga en una lista <Consulta>.
	 * 
	 * @param desde
	 * @param hasta
	 * @return una lista con todas Consultas realizadas entre el renago de fecha
	 *         indicado (desde, hasta)
	 * @throws Exception
	 */

	public static List listarConsultas(int desde, int hasta) throws Exception {
		List lista = null;
		ConsultaDAOImpl consultaDAO = new ConsultaDAOImpl();
		try {
			lista = consultaDAO.listar(desde, hasta);
		} catch (Exception e) {
			throw new Exception();
		}
		return lista;
	}

	public static List listarMaterias() throws Exception {
		List lista = null;
		ConsultaDAOImpl consultaDAO = new ConsultaDAOImpl();
		try {
			lista = consultaDAO.listarMaterias();
		} catch (Exception e) {
			throw new Exception();
		}
		return lista;
	}
}
